package pe.com.astech.web.service;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import pe.com.astech.web.bean.DetalleOrdenTrabajoBean;
import pe.com.astech.web.bean.OrdenTrabajoBean;
import pe.com.astech.web.dao.OrdenTrabajoDao;
import pe.com.astech.web.util.Constantes;

@Service
public class OrdenTrabajoServiceImpl implements OrdenTrabajoService {
	
	@Autowired
	public OrdenTrabajoDao ordenTrabajoDao;
	
	private static final Log log = LogFactory.getLog(OrdenTrabajoServiceImpl.class);
	
	@Override
	public List<OrdenTrabajoBean> buscarOrdenTrabajo(
			String mensajeTrazabilidad, String nroPedido, String estadoProceso) {
		
		List<OrdenTrabajoBean> list = ordenTrabajoDao.buscarOrdenTrabajo(mensajeTrazabilidad,nroPedido,estadoProceso);
		
		return list;
	}

	@Override
	public Object[] eliminarMaterialOTLista(String mensajeTrazabilidad,
			String id_material,
			List<DetalleOrdenTrabajoBean> ordentrabajoListMateriales,
			List<DetalleOrdenTrabajoBean> ordentrabajoListMaterialesElim) {

		Object[] listas = new Object[Constantes.intDOS];
		
		DetalleOrdenTrabajoBean detalleOrdenTrabajoBean = new DetalleOrdenTrabajoBean();
		log.info(mensajeTrazabilidad + " tamanio de la lista antes " + ordentrabajoListMateriales.size());
		
		for(DetalleOrdenTrabajoBean bean:ordentrabajoListMateriales){
			if(bean.getMaterial_id().equals(id_material)){
				detalleOrdenTrabajoBean = bean;
				break;
			}
		}
		
		ordentrabajoListMateriales.remove(detalleOrdenTrabajoBean);
		log.info(mensajeTrazabilidad + " tamanio de la lista despues " + ordentrabajoListMateriales.size());
		
		
		if(ordentrabajoListMaterialesElim!=null){
			ordentrabajoListMaterialesElim.add(detalleOrdenTrabajoBean);
		}
		else{
			ordentrabajoListMaterialesElim = new ArrayList<DetalleOrdenTrabajoBean>();
			ordentrabajoListMaterialesElim.add(detalleOrdenTrabajoBean);
		}
		
		listas[Constantes.intCERO]=ordentrabajoListMateriales;
		listas[Constantes.intUNO]=ordentrabajoListMaterialesElim;
		
		return listas;
	}

	@Override
	public DetalleOrdenTrabajoBean obtenerDetalleOTLista(
			String mensajeTrazabilidad, String id_material,
			List<DetalleOrdenTrabajoBean> ordentrabajoListMateriales) {
		
		log.info(mensajeTrazabilidad + " tamanio de la lista antes " + ordentrabajoListMateriales.size());
		DetalleOrdenTrabajoBean detalleOrdenTrabajoBean = new DetalleOrdenTrabajoBean();
		
		for(DetalleOrdenTrabajoBean bean:ordentrabajoListMateriales){
			if(bean.getMaterial_id().equals(id_material)){
				detalleOrdenTrabajoBean = bean;
				break;
			}
		}
		
		detalleOrdenTrabajoBean.setOpcion(Constantes.ACTUALIZAR);
		
		log.info(mensajeTrazabilidad + " tamanio de la lista despues " + ordentrabajoListMateriales.size());
		
		return detalleOrdenTrabajoBean;
	}

	@Override
	public Object[] agregarMaterialOTLista(
			String mensajeTrazabilidad,
			List<DetalleOrdenTrabajoBean> ordentrabajoListMateriales,
			DetalleOrdenTrabajoBean detalleOrdenTrabajoBean) {

		boolean b = true;
		Object[] objetos = new Object[Constantes.intDOS];
		objetos[1] = Constantes.OK;
		
		String id_Material = Constantes.VACIO;
		String nombreMaterial = Constantes.VACIO;
		int ubicacion = Constantes.intCERO;
		
		ubicacion = detalleOrdenTrabajoBean.getMaterial_id().indexOf(Constantes.GUION);
		id_Material = detalleOrdenTrabajoBean.getMaterial_id().substring(Constantes.intCERO,ubicacion);
		nombreMaterial = detalleOrdenTrabajoBean.getMaterial_id().substring(ubicacion+Constantes.intUNO);	
		
		detalleOrdenTrabajoBean.setMaterial_id(id_Material);
		detalleOrdenTrabajoBean.setNombre_material(nombreMaterial);
		
		for(DetalleOrdenTrabajoBean bean:ordentrabajoListMateriales){
			if(bean.getMaterial_id().equals(detalleOrdenTrabajoBean.getMaterial_id())){
				b = false;
				break;
			}
		}
		
		if(b){
			ordentrabajoListMateriales.add(detalleOrdenTrabajoBean);
			objetos[Constantes.intCERO] = ordentrabajoListMateriales;
		}
		else{
			objetos[1] = Constantes.NOOK;
		}
		log.info(mensajeTrazabilidad + " tamanio de la lista " + ordentrabajoListMateriales.size());
		
		return objetos;
	}

	@Override
	public List<DetalleOrdenTrabajoBean> actualizarMaterialOTLista(
			String mensajeTrazabilidad,
			List<DetalleOrdenTrabajoBean> ordentrabajoListMateriales,
			DetalleOrdenTrabajoBean detalleOrdenTrabajoBean) {


		for(int i=0;i<ordentrabajoListMateriales.size();i++){
			DetalleOrdenTrabajoBean bean = ordentrabajoListMateriales.get(i); 
			if(bean.getMaterial_id().equals(detalleOrdenTrabajoBean.getMaterial_id())){
				ordentrabajoListMateriales.set(i, detalleOrdenTrabajoBean);
				break;
			}
		}
		log.info(mensajeTrazabilidad + " tamanio de la lista " + ordentrabajoListMateriales.size());
		
		return ordentrabajoListMateriales;
	}

	@Override
	public Object[] guardarOT(String mensajeTrazabilidad,
			OrdenTrabajoBean ordenTrabajoBean,
			List<DetalleOrdenTrabajoBean> ordentrabajoListMateriales) {
		
		Object[] respuestas = new Object[Constantes.intTRES];
		List<OrdenTrabajoBean> ordentrabajoListOrdenTrabajo = new ArrayList<OrdenTrabajoBean>();
		String resultado = Constantes.OK;
		
		boolean b = true;
		if(ordentrabajoListMateriales!=null){
			if(ordentrabajoListMateriales.size()==Constantes.intCERO){
				b = false;
			}
		}else{
			b = false;
		}
		
		if(b){
			String ejemplo = ordenTrabajoBean.getEjemplo();
			ordenTrabajoBean.setEjemplo((ejemplo.equals(Constantes.TRUE))?Constantes.EJEMPLO_OT_OK:Constantes.EJEMPLO_OT_NOOK);
						
			if(ordenTrabajoBean.getEjemplo().equals(Constantes.EJEMPLO_OT_OK)){
				ordenTrabajoDao.actualizarEjemplosOT(mensajeTrazabilidad,ordenTrabajoBean);
			}
			
			String[] rpta = ordenTrabajoDao.guardarOrdenTrabajo(mensajeTrazabilidad,ordenTrabajoBean);
			
			String nroOT = rpta[Constantes.intUNO];
			respuestas[Constantes.intCERO] = nroOT;
			
			for(DetalleOrdenTrabajoBean detalleOrdenTrabajoBean:ordentrabajoListMateriales){
				detalleOrdenTrabajoBean.setOrden_trabajo_id(rpta[Constantes.intCERO]);
				ordenTrabajoDao.guardarDetalleOrdenTrabajo(mensajeTrazabilidad,detalleOrdenTrabajoBean);
			}
			
		}
		else{
			//retornar un mensaje indicando que debe ingresar por lo menos un material
			resultado = Constantes.NOOK;
		}
		
		respuestas[Constantes.intUNO] = ordentrabajoListOrdenTrabajo = ordenTrabajoDao.buscarOrdenTrabajo(mensajeTrazabilidad, Constantes.VACIO, Constantes.VACIO);
		respuestas[Constantes.intDOS] = resultado;
				
		return respuestas;
	}

	@Override
	public OrdenTrabajoBean obtenerOTbyId(String mensajeTrazabilidad,
			String id_orden_trabajo) {

		OrdenTrabajoBean ordenTrabajoBean = ordenTrabajoDao.obtenerOTbyId(mensajeTrazabilidad,id_orden_trabajo);
		List<DetalleOrdenTrabajoBean> listDetalleOT = ordenTrabajoDao.obtenerDetalleOT(mensajeTrazabilidad,id_orden_trabajo);
		ordenTrabajoBean.setOpcion(Constantes.ACTUALIZAR);
		ordenTrabajoBean.setListDetalleOT(listDetalleOT);
		
		return ordenTrabajoBean;
	}

	@Override
	public Object[] actualizarOT(String mensajeTrazabilidad,
			OrdenTrabajoBean ordenTrabajoBean,
			List<DetalleOrdenTrabajoBean> ordentrabajoListMateriales,
			List<DetalleOrdenTrabajoBean> ordentrabajoListMaterialesElim) {
		
		Object[] respuestas = new Object[Constantes.intDOS];
		List<OrdenTrabajoBean> ordentrabajoListOrdenTrabajo = new ArrayList<OrdenTrabajoBean>();
		String resultado = Constantes.OK;
		
		boolean b = true;
		if(ordentrabajoListMateriales!=null){
			if(ordentrabajoListMateriales.size()==Constantes.intCERO){
				b = false;
			}
		}else{
			b = false;
		}
		
		if(b){
			String ejemplo = ordenTrabajoBean.getEjemplo();
			ordenTrabajoBean.setEjemplo((ejemplo.equals(Constantes.TRUE))?Constantes.EJEMPLO_OT_OK:Constantes.EJEMPLO_OT_NOOK);
			
			if(ordenTrabajoBean.getEjemplo().equals(Constantes.EJEMPLO_OT_OK)){
				ordenTrabajoDao.actualizarEjemplosOT(mensajeTrazabilidad,ordenTrabajoBean);
			}else{
				ordenTrabajoBean.setEjemplo(Constantes.EJEMPLO_OT_NOOK);
			}
			
			ordenTrabajoDao.actualizarOrdenTrabajo(mensajeTrazabilidad,ordenTrabajoBean);
			
			if(ordentrabajoListMaterialesElim!=null){
				for(DetalleOrdenTrabajoBean detalleOrdenTrabajoBean:ordentrabajoListMaterialesElim){
					detalleOrdenTrabajoBean.setOrden_trabajo_id(ordenTrabajoBean.getId_orden_trabajo());
					if(!(null==detalleOrdenTrabajoBean.getId_detalle_orden_trabajo() || Constantes.VACIO.equals(detalleOrdenTrabajoBean.getId_detalle_orden_trabajo())))
						log.info(mensajeTrazabilidad + " " + detalleOrdenTrabajoBean.toString());
						ordenTrabajoDao.eliminarMaterialesOT(mensajeTrazabilidad,detalleOrdenTrabajoBean);
				}
			}
			
			for(DetalleOrdenTrabajoBean detalleOrdenTrabajoBean:ordentrabajoListMateriales){
				detalleOrdenTrabajoBean.setOrden_trabajo_id(ordenTrabajoBean.getId_orden_trabajo());
				log.info(mensajeTrazabilidad + " " + detalleOrdenTrabajoBean.toString());
				ordenTrabajoDao.guardarDetalleOrdenTrabajo(mensajeTrazabilidad,detalleOrdenTrabajoBean);
			}
		}
		else{
			//retornar un mensaje indicando que debe ingresar por lo menos un material
			resultado = Constantes.NOOK;
		}
		
		ordentrabajoListOrdenTrabajo = ordenTrabajoDao.buscarOrdenTrabajo(mensajeTrazabilidad, Constantes.VACIO, Constantes.VACIO);
		respuestas[Constantes.intCERO] = ordentrabajoListOrdenTrabajo;
		respuestas[Constantes.intUNO] = resultado;
		
		return respuestas;
	}

	@Override
	public List<DetalleOrdenTrabajoBean> cargarEjemploOT(
			String mensajeTrazabilidad,String orden_pedido_ID) {

		log.info(mensajeTrazabilidad + " cargarEjemploOT ");
		String maquinaria_ID = orden_pedido_ID.split(Constantes.GUION)[Constantes.intUNO];
		List<DetalleOrdenTrabajoBean> listDetalleOT = ordenTrabajoDao.cargarEjemploOT(mensajeTrazabilidad,maquinaria_ID);
		return listDetalleOT;
	}

	@Override
	public List<OrdenTrabajoBean> eliminarOT(String mensajeTrazabilidad,
			String id_orden_trabajo) {

		log.info(mensajeTrazabilidad + " eliminarOT ");
		
		DetalleOrdenTrabajoBean detalleBean = new DetalleOrdenTrabajoBean();
		detalleBean.setOrden_trabajo_id(id_orden_trabajo);
		
		ordenTrabajoDao.eliminarDetalleOTbyIdOT(mensajeTrazabilidad,id_orden_trabajo);

		ordenTrabajoDao.eliminarOT(mensajeTrazabilidad,id_orden_trabajo);
		
		List<OrdenTrabajoBean> list = ordenTrabajoDao.buscarOrdenTrabajo(mensajeTrazabilidad,Constantes.VACIO,Constantes.VACIO);
		return list;
	}
	
}
